package h1.sismetro.negocio.funcionario;

import h1.sismetro.classesbasicas.Funcionario;
import h1.sismetro.dao.RepositorioFuncionarioJDBC;
import h1.sismetro.exceptions.AcessoAoBancoException;
import h1.sismetro.exceptions.ConexaoComBancoException;
import h1.sismetro.exceptions.FuncionarioJaCadastradoException;
import h1.sismetro.exceptions.FuncionarioNaoEncontradoException;
import h1.sismetro.exceptions.NenhumFuncionarioCadastradoException;

import java.util.List;

public class CadastroFuncionario implements ICadastroFuncionario {
	
	private RepositorioFuncionarioJDBC repositorioFuncionario;
	
	
	public CadastroFuncionario(){
		this.repositorioFuncionario = new RepositorioFuncionarioJDBC();
	}
	
	public CadastroFuncionario(RepositorioFuncionarioJDBC repositorio){
		this.repositorioFuncionario = repositorio;
	}

	
	
	//@Override
	public void alterar(Funcionario novoFuncionario) throws AcessoAoBancoException, ConexaoComBancoException, FuncionarioNaoEncontradoException {
		if(this.repositorioFuncionario.existe(novoFuncionario.getMatricula())){
			this.repositorioFuncionario.atualizar(novoFuncionario);
		}else{
			FuncionarioNaoEncontradoException e =
				new FuncionarioNaoEncontradoException(novoFuncionario.getMatricula());
			throw e;
		}
	}

	
	//@Override
	public void cadastrar(Funcionario novoFuncionario) throws AcessoAoBancoException, ConexaoComBancoException, FuncionarioJaCadastradoException {
		if(!this.repositorioFuncionario.existe(novoFuncionario.getMatricula())){
			this.repositorioFuncionario.inserir(novoFuncionario);
		}else{
			FuncionarioJaCadastradoException e =
				new FuncionarioJaCadastradoException(novoFuncionario.getMatricula());
			throw e;
		}
	}

	
	//@Override
	public void excluir(int matricula) throws AcessoAoBancoException, ConexaoComBancoException, FuncionarioNaoEncontradoException {
		if(this.repositorioFuncionario.existe(matricula)){
			this.repositorioFuncionario.remover(matricula);
		}else{
			FuncionarioNaoEncontradoException e =
				new FuncionarioNaoEncontradoException(matricula);
			throw e;
		}
	}

	//@Override
	public boolean existe(int matricula) throws AcessoAoBancoException, ConexaoComBancoException {		
		return this.repositorioFuncionario.existe(matricula);
	}

	//@Override
	public List<Funcionario> imprimir() throws AcessoAoBancoException, ConexaoComBancoException, NenhumFuncionarioCadastradoException {
		if(!(this.repositorioFuncionario.listar().size() <= 0)){
			this.repositorioFuncionario.listar();
		}else{
			NenhumFuncionarioCadastradoException e =
				new NenhumFuncionarioCadastradoException();
			throw e;
		}
		return null;
	}

	//@Override
	public int obterCodigo() throws ConexaoComBancoException, AcessoAoBancoException {		
		return this.repositorioFuncionario.gerarCodigo();
	}

	//@Override
	public Funcionario recuperar(int matricula) throws AcessoAoBancoException, ConexaoComBancoException, FuncionarioNaoEncontradoException {		
		if(this.repositorioFuncionario.existe(matricula)){
			return this.repositorioFuncionario.localizar(matricula);
		}else{
			FuncionarioNaoEncontradoException e =
				new FuncionarioNaoEncontradoException(matricula);
			throw e;
		}
		
	}	


}
